//
//  QKUserAccountViewModel.m
//  QKWeibo-OC
//
//  Created by iMac_Kurt on 16/8/20.
//  Copyright © 2016年 Kurt_Qi. All rights reserved.
//

#import "QKUserAccountViewModel.h"
#import "NetworkTool.h"

/// 用户账户的视图模型
@implementation QKUserAccountViewModel
/// 创建用户账户视图模型单例
/// - 原因：从磁盘解档效率低且消耗资源，创建单例之后不需要再访问磁盘
/// @return QKUserAccountViewModel
+ (instancetype)sharedUserAccount {
    static QKUserAccountViewModel *userAccount;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        userAccount = [[QKUserAccountViewModel alloc]init];
    });
    return userAccount;
}

// 用户头像URL
- (NSURL *)avatarURL {
    return [NSURL URLWithString:self.account.avatar_large];
}

// 判断用户是否登录
- (BOOL)userLogon {
    // 判断是否存在有效（未过期）的AccessToken
    if (self.account.access_token != nil && !self.isExpired) {
        // 已成功登录，进入首页
        return YES;
    }
    // 未登录成功，加载访客视图
    return NO;
}

// 判断accessToken是否过期
- (BOOL)isExpired {
    // 测试：过期与否，修改expiresDate为1天前
    //self.account.expiresDate = [NSDate dateWithTimeIntervalSinceNow:-3600];
    
    // 如果过期日期在当前日期之后（过期日期和当前相比，结果为降序），说明未过期
    if ([self.account.expiresDate compare:[NSDate date]] == NSOrderedDescending) {
        return NO;
    }
    // 过期
    return YES;
}

// accessToken属性
- (NSString *)accessToken {
    // 判断是否过期
    if (!self.isExpired) {
        return self.account.access_token;
    }else {
        return nil;
    }
}

#pragma mark - 封装网络方法
- (void)loadAccessToken:(NSString *)code finished:(void(^)(BOOL isSuccessed))finished {
    // 获取AccessToken
    [[NetworkTool sharedTools] loadAccessTokenWithCode:code finished:^(id result, NSError *error) {
        // 字典转模型
        self.account = [QKUserAccount initWithDict:result];
        
        // 请求获取用户信息
        
        [[NetworkTool sharedTools] getUserInfoWithUid:self.account.uid finished:^(id result, NSError *error) {
            if (error != nil) {
                NSLog(@"出错");
                // 错误通知控制器，执行回调
                finished(NO);
            }
            // 获取到用户信息
            //NSLog(@"%@--%@",result[@"screen_name"], result[@"avatar_large"]);
            
            // 将需要的用户信息存到模型中
            self.account.screen_name = result[@"screen_name"];
            self.account.avatar_large = result[@"avatar_large"];
            
            // 将用户模型中的数据储存到本地沙盒路径
            [self.account saveUserAccount];
            //NSLog(@"%@", self.account);
            
            // 成功通知控制器，执行回调
            finished(YES);
        }];
        
//        [[NetworkTool sharedTools] getUserInfoWithAccount:self.account finished:^(id result, NSError *error) {
//            if (error != nil) {
//                NSLog(@"出错");
//                // 错误通知控制器，执行回调
//                finished(NO);
//            }
//            // 获取到用户信息
//            //NSLog(@"%@--%@",result[@"screen_name"], result[@"avatar_large"]);
//            
//            // 将需要的用户信息存到模型中
//            self.account.screen_name = result[@"screen_name"];
//            self.account.avatar_large = result[@"avatar_large"];
//            
//            // 将用户模型中的数据储存到本地沙盒路径
//            [self.account saveUserAccount];
//            //NSLog(@"%@", self.account);
//            
//            // 成功通知控制器，执行回调
//            finished(YES);
//            
//        }];
    }];

}

// 重写构造方法：加载本地数据
- (instancetype)init {
    
    // 从本地沙盒中解档用户账户数据
    NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject stringByAppendingPathComponent:@"account.plist"];
    
    self.account = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
    
    // 判断accessToken是否过期，如果过期，清空数据
    if (self.isExpired) {
        NSLog(@"已过期");
        self.account = nil;
    }
    
    return self;
}

@end
